package aufgabe2;

import aufgabe1.InterfaceListe;
import aufgabe1.Liste;


public class ImplementationMatrixList implements InterfaceMatrix{

	private InterfaceListe<ImplementationMatrixListElem> matrix;
	
	private int hoehe;
	
	private int breite;
	
	private int zugriffe;
	
	public ImplementationMatrixList(int m, int n){
		hoehe =  m;
		breite = n;
		this.matrix = new Liste<ImplementationMatrixListElem>();
		zugriffe = 0;
	}
	
	@Override
	public int getHoehe() {
		return hoehe;
	}

	@Override
	public int getBreite() {
		return breite;
	}
	
	@Override
	public double getMatrixMN(int m, int n) {
		InterfaceListe<ImplementationMatrixListElem> temp1 = new Liste<ImplementationMatrixListElem>();
		//System.out.println("Hier");
		zugriffe = zugriffe + this.matrix.getReferenceCounter();
		
		double wert = 0.0;
		boolean nichtGefunden = true;
		
		while(!matrix.isEmpty()){
			ImplementationMatrixListElem tempElem = matrix.head();
			temp1.cons(tempElem);
			if(nichtGefunden && tempElem.getPosZeile() == m && tempElem.getPosSpalte() == n){
				wert = tempElem.getVal();
				nichtGefunden = false;
			}
			
		}
		matrix = temp1;
		return wert;
	}

	@Override
	public void setMatrixMN(int m, int n, double val) {
		//TODO Loeschen alter Elemente
		if(val != 0.0){
			ImplementationMatrixListElem elem = new ImplementationMatrixListElem(m, n, val);
			matrix.cons(elem);	
		}
		zugriffe++;
	}
	
	
	@Override
	public InterfaceMatrix getNewMatrix(int zeilen, int spalten) {
		return new ImplementationMatrixList(zeilen, spalten);
	}
	
	@Override
	public int getReferenceCounter(){
		
		return this.zugriffe + this.matrix.getReferenceCounter();
	}
	
	@Override
	public void resetReferenceCounter(){
		matrix.resetReferenceCounter();
		zugriffe = 0;
	}
}
